package com.lx.bilibili.util;

import com.lx.bilibili.entity.VideoEx;

import java.util.Comparator;
import java.util.List;
import java.util.stream.Collectors;

public class VideoRecommender {

    /**
     * 视频推荐算法
     * @param videos 视频列表
     * @return 排序后的推荐视频列表
     */
    public static List<VideoEx> recommendVideos(List<VideoEx> videos) {
        // 获取当前时间用于判断是否为最新视频
        long currentTime = System.currentTimeMillis();
        long oneDayInMillis = 24 * 60 * 60 * 1000L;

        // 计算每个视频的推荐得分并排序
        return videos.stream()
                .map(video -> {
                    // 基础得分计算
                    double score = calculateBaseScore(video);

                    // 如果是24小时内发布的视频，提权1.5倍
                    if (currentTime - video.getTime().getTime() <= oneDayInMillis) {
                        score *= 1.5;
                    }

                    // 设置计算后的得分
                    video.setRecommendScore(score);
                    return video;
                })
                // 按得分降序排序
                .sorted(Comparator.comparingDouble(VideoEx::getRecommendScore).reversed())
                .collect(Collectors.toList());
    }

    /**
     * 计算视频基础得分
     * 公式: 硬币*0.4 + 收藏*0.3 + 弹幕*0.4 + 播放*0.25 + 点赞*0.4
     */
    private static double calculateBaseScore(VideoEx video) {
        return video.getCoin() * 0.4 +
                video.getCollect() * 0.3 +
                video.getDanmuCount() * 0.4 +
                video.getVcount() * 0.25 +
                video.getLikes() * 0.4;
    }
}
